/* 
 * File:   Rationnel.h
 * Author: Gab'z
 *
 * Created on 1 mai 2012, 19:46
 */

#ifndef RATIONNEL_H
#define	RATIONNEL_H
#include "NombreSimple.h"
#include "Entier.h"
#include <stdexcept>

class Rationnel : public NombreSimple {
    int _num;
    int _denom;
public:

    Rationnel(int n, int d = 1) : _num(n), _denom(d != 0 ? d : 1) {
        if (d == 0)throw std::invalid_argument("Division par 0 à l'initialisation d'un rationnel");
    }

    Rationnel(const Rationnel& r) : _num(r._num), _denom(r._denom) {
    }

    Rationnel(const Entier& e) : _num(e.getX()), _denom(1) {
    }
    virtual ~Rationnel();

    Rationnel* clone() const;

    int getNum() const {
        return _num;
    }

    int getDenom() const {
        return _denom;
    }

    double value() const;

    Rationnel& operator=(const Rationnel& r) {
        if (this == &r) return *this;
        _num = r._num;
        _denom = r._denom;
        return *this;
    }
    Rationnel& operator+=(const Rationnel& r);
    Rationnel& operator-=(const Rationnel& r);
    Rationnel& operator*=(const Rationnel& r);
    Rationnel& operator/=(const Rationnel& r);

    //    Rationnel operator+() const {
    //        return Rationnel(*this);
    //    }
    //
    //    Rationnel operator-() const {
    //        Rationnel r(*this);
    //        r._num = -r._num;
    //        return r;
    //    }

    std::string toString() const;
private:
    // calcul du pgcd
    int pgcd(int a, int b) const;

    // simplification de Rationnel
    void simplifier();

};

Rationnel operator+(const Rationnel& r1, const Rationnel& r2);
Rationnel operator-(const Rationnel& r1, const Rationnel& r2);
Rationnel operator*(const Rationnel& r1, const Rationnel& r2);
Rationnel operator/(const Rationnel& r1, const Rationnel& r2);

#endif	/* RATIONNEL_H */